/*
 * Шаблон Iterator (также известный как Cursor) — Шаблон проектирования, 
 * относится к паттернам поведения. Представляет собой объект, позволяющий 
 * получить последовательный доступ к элементам объекта-агрегата без 
 * использования описаний каждого из объектов, входящий в состав агрегации.
 */
package patterns;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class TestIterator {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(10, 20, 30, 40, 50);
        for (Integer i : list) {
            System.out.print(i + " ");
        }

        System.out.println();
        for (Iterator<Integer> iterator = list.iterator(); iterator.hasNext();) {
            System.out.print(iterator.next() + " ");
        }

        System.out.println();
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }

        System.out.println();
        Company company = new Company(Arrays.asList(
                new Employee("Mike", 45),
                new Employee("Sara", 21)));
        for (Employee emp : company) {
            System.out.println(emp);
        }
    }
}

class Company implements Iterable<Employee> {

    private List<Employee> employees = new ArrayList<Employee>();

    Company(List<Employee> employees) {
        this.employees = employees;
    }

    @Override
    public Iterator<Employee> iterator() {
        return new ArrayList<Employee>(employees).iterator();
    }
}

class Employee {

    private String name;
    private int age;

    Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Employee[name=" + name + ", age=" + age + ']';
    }
}
